home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / var / lib / dpkg / info / xfonts-base.postrm < prev    next >
Text File  |  2007-10-24  |  31KB  |  942 lines

  1. #!/bin/sh
  2. # Debian xfonts-base package post-removal script
  3. # Copyright ┬⌐ 1998-2001, 2004 Branden Robinson
  4. # Licensed under the GNU General Public License, version 2.  See the file
  5. # /usr/share/common-licenses/GPL or <http://www.gnu.org/copyleft/gpl.txt>.
  6. # Acknowledgements to Stephen Early, Mark Eichin, and Manoj Srivastava.
  7.  
  8. set -e
  9.  
  10. THIS_PACKAGE=xfonts-base
  11. THIS_SCRIPT=postrm
  12.  
  13. # $Id$
  14.  
  15. # This is the X Strike Force shell library for X Window System package
  16. # maintainer scripts.  It serves to define shell functions commonly used by
  17. # such packages, and performs some error checking necessary for proper operation
  18. # of those functions.  By itself, it does not "do" much; the maintainer scripts
  19. # invoke the functions defined here to accomplish package installation and
  20. # removal tasks.
  21.  
  22. # If you are reading this within a Debian package maintainer script (e.g.,
  23. # /var/lib/dpkg)info/PACKAGE.{config,preinst,postinst,prerm,postrm}), you can
  24. # skip past this library by scanning forward in this file to the string
  25. # "GOBSTOPPER".
  26.  
  27. SOURCE_VERSION=1:1.0.0-5
  28. OFFICIAL_BUILD=yes
  29.  
  30. # Use special abnormal exit codes so that problems with this library are more
  31. # easily tracked down.
  32. SHELL_LIB_INTERNAL_ERROR=86
  33. SHELL_LIB_THROWN_ERROR=74
  34. SHELL_LIB_USAGE_ERROR=99
  35.  
  36. # old -> new variable names
  37. if [ -z "$DEBUG_XORG_PACKAGE" ] && [ -n "$DEBUG_XFREE86_PACKAGE" ]; then
  38.   DEBUG_XORG_PACKAGE="$DEBUG_XFREE86_PACKAGE"
  39. fi
  40. if [ -z "$DEBUG_XORG_DEBCONF" ] && [ -n "$DEBUG_XFREE86_DEBCONF" ]; then
  41.   DEBUG_XORG_DEBCONF="$DEBUG_XFREE86_DEBCONF"
  42. fi
  43.  
  44. # initial sanity checks
  45. if [ -z "$THIS_PACKAGE" ]; then
  46.   cat >&2 <<EOF
  47. Error: package maintainer script attempted to use shell library without
  48. definining \$THIS_PACKAGE shell variable.  Please report the package name,
  49. version, and the text of this error message to the Debian Bug Tracking System.
  50. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  51. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  52. "doc-debian" package, or install the "reportbug" package and use the command of
  53. the same name to file a report against version $SOURCE_VERSION of this package.
  54. EOF
  55.   exit $SHELL_LIB_USAGE_ERROR
  56. fi
  57.  
  58. if [ -z "$THIS_SCRIPT" ]; then
  59.   cat >&2 <<EOF
  60. Error: package maintainer script attempted to use shell library without
  61. definining \$THIS_SCRIPT shell variable.  Please report the package name,
  62. version, and the text of this error message to the Debian Bug Tracking System.
  63. Visit <http://www.debian.org/Bugs/Reporting> on the World Wide Web for
  64. instructions, read the file /usr/share/doc/debian/bug-reporting.txt from the
  65. "doc-debian" package, or install the "reportbug" package and use the command of
  66. the same name to file a report against version $SOURCE_VERSION of the
  67. "$THIS_PACKAGE" package.
  68. EOF
  69.   exit $SHELL_LIB_USAGE_ERROR
  70. fi
  71.  
  72. ARCHITECTURE="$(dpkg --print-installation-architecture)"
  73.  
  74. LAPTOP=""
  75. if [ -n "$(which laptop-detect)" ]; then
  76.     if laptop-detect >/dev/null; then
  77.     LAPTOP=true
  78.     fi
  79. fi
  80.  
  81. if [ "$1" = "reconfigure" ] || [ -n "$DEBCONF_RECONFIGURE" ]; then
  82.   RECONFIGURE="true"
  83. else
  84.   RECONFIGURE=
  85. fi
  86.  
  87. if ([ "$1" = "install" ] || [ "$1" = "configure" ]) && [ -z "$2" ]; then
  88.   FIRSTINST="yes"
  89. fi
  90.  
  91. if [ -z "$RECONFIGURE" ] && [ -z "$FIRSTINST" ]; then
  92.   UPGRADE="yes"
  93. fi
  94.  
  95. trap "message;\
  96.       message \"Received signal.  Aborting $THIS_PACKAGE package $THIS_SCRIPT script.\";\
  97.       message;\
  98.       exit 1" HUP INT QUIT TERM
  99.  
  100. reject_nondigits () {
  101.   # syntax: reject_nondigits [ operand ... ]
  102.   #
  103.   # scan operands (typically shell variables whose values cannot be trusted) for
  104.   # characters other than decimal digits and barf if any are found
  105.   while [ -n "$1" ]; do
  106.     # does the operand contain anything but digits?
  107.     if ! expr "$1" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  108.       # can't use die(), because it wraps message() which wraps this function
  109.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_nondigits() encountered" \
  110.            "possibly malicious garbage \"$1\"" >&2
  111.       exit $SHELL_LIB_THROWN_ERROR
  112.     fi
  113.     shift
  114.   done
  115. }
  116.  
  117. reject_whitespace () {
  118.   # syntax: reject_whitespace [ operand ]
  119.   #
  120.   # scan operand (typically a shell variable whose value cannot be trusted) for
  121.   # whitespace characters and barf if any are found
  122.   if [ -n "$1" ]; then
  123.     # does the operand contain any whitespace?
  124.     if expr "$1" : "[[:space:]]" > /dev/null 2>&1; then
  125.       # can't use die(), because I want to avoid forward references
  126.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_whitespace() encountered" \
  127.            "possibly malicious garbage \"$1\"" >&2
  128.       exit $SHELL_LIB_THROWN_ERROR
  129.     fi
  130.   fi
  131. }
  132.  
  133. reject_unlikely_path_chars () {
  134.   # syntax: reject_unlikely_path_chars [ operand ... ]
  135.   #
  136.   # scan operands (typically shell variables whose values cannot be trusted) for
  137.   # characters unlikely to be seen in a path and which the shell might
  138.   # interpret and barf if any are found
  139.   while [ -n "$1" ]; do
  140.     # does the operand contain any funny characters?
  141.     if expr "$1" : '.*[!$&()*;<>?|].*' > /dev/null 2>&1; then
  142.       # can't use die(), because I want to avoid forward references
  143.       echo "$THIS_PACKAGE $THIS_SCRIPT error: reject_unlikely_path_chars()" \
  144.            "encountered possibly malicious garbage \"$1\"" >&2
  145.       exit $SHELL_LIB_THROWN_ERROR
  146.     fi
  147.     shift
  148.   done
  149. }
  150.  
  151. # Query the terminal to establish a default number of columns to use for
  152. # displaying messages to the user.  This is used only as a fallback in the
  153. # event the COLUMNS variable is not set.  ($COLUMNS can react to SIGWINCH while
  154. # the script is running, and this cannot, only being calculated once.)
  155. DEFCOLUMNS=$(stty size 2> /dev/null | awk '{print $2}') || true
  156. if ! expr "$DEFCOLUMNS" : "[[:digit:]]\+$" > /dev/null 2>&1; then
  157.   DEFCOLUMNS=80
  158. fi
  159.  
  160. message () {
  161.   # pretty-print messages of arbitrary length
  162.   reject_nondigits "$COLUMNS"
  163.   echo "$*" | fmt -t -w ${COLUMNS:-$DEFCOLUMNS} >&2
  164. }
  165.  
  166. observe () {
  167.   # syntax: observe message ...
  168.   #
  169.   # issue observational message suitable for logging someday when support for
  170.   # it exists in dpkg
  171.   if [ -n "$DEBUG_XORG_PACKAGE" ]; then
  172.     message "$THIS_PACKAGE $THIS_SCRIPT note: $*"
  173.   fi
  174. }
  175.  
  176. warn () {
  177.   # syntax: warn message ...
  178.   #
  179.   # issue warning message suitable for logging someday when support for
  180.   # it exists in dpkg; also send to standard error
  181.   message "$THIS_PACKAGE $THIS_SCRIPT warning: $*"
  182. }
  183.  
  184. die () {
  185.   # syntax: die message ...
  186.   #
  187.   # exit script with error message
  188.   message "$THIS_PACKAGE $THIS_SCRIPT error: $*"
  189.   exit $SHELL_LIB_THROWN_ERROR
  190. }
  191.  
  192. internal_error () {
  193.   # exit script with error; essentially a "THIS SHOULD NEVER HAPPEN" message
  194.   message "internal error: $*"
  195.   if [ -n "$OFFICIAL_BUILD" ]; then
  196.     message "Please report a bug in the $THIS_SCRIPT script of the" \
  197.             "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  198.             "Tracking System.  Include all messages above that mention the" \
  199.             "$THIS_PACKAGE package.  Visit " \
  200.             "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  201.             "instructions, read the file" \
  202.             "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  203.             "package, or install the reportbug package and use the command of" \
  204.             "the same name to file a report."
  205.   fi
  206.   exit $SHELL_LIB_INTERNAL_ERROR
  207. }
  208.  
  209. usage_error () {
  210.   message "usage error: $*"
  211.   message "Please report a bug in the $THIS_SCRIPT script of the" \
  212.           "$THIS_PACKAGE package, version $SOURCE_VERSION to the Debian Bug" \
  213.           "Tracking System.  Include all messages above that mention the" \
  214.           "$THIS_PACKAGE package.  Visit " \
  215.           "<http://www.debian.org/Bugs/Reporting> on the World Wide Web for" \
  216.           "instructions, read the file" \
  217.           "/usr/share/doc/debian/bug-reporting.txt from the doc-debian" \
  218.           "package, or install the reportbug package and use the command of" \
  219.           "the same name to file a report."
  220.   exit $SHELL_LIB_USAGE_ERROR
  221. }
  222.  
  223.  
  224. maplink () {
  225.   # returns what symlink should point to; i.e., what the "sane" answer is
  226.   # Keep this in sync with the debian/*.links files.
  227.   # This is only needed for symlinks to directories.
  228.   #
  229.   # XXX: Most of these look wrong in the X11R7 world and need to be fixed.
  230.   # If we've stopped using this function, fixing it might enable us to re-enable
  231.   # it again and catch more errors.
  232.   case "$1" in
  233.     /etc/X11/xkb/compiled) echo /var/lib/xkb ;;
  234.     /etc/X11/xkb/xkbcomp) echo /usr/X11R6/bin/xkbcomp ;;
  235.     /usr/X11R6/lib/X11/app-defaults) echo /etc/X11/app-defaults ;;
  236.     /usr/X11R6/lib/X11/fs) echo /etc/X11/fs ;;
  237.     /usr/X11R6/lib/X11/lbxproxy) echo /etc/X11/lbxproxy ;;
  238.     /usr/X11R6/lib/X11/proxymngr) echo /etc/X11/proxymngr ;;
  239.     /usr/X11R6/lib/X11/rstart) echo /etc/X11/rstart ;;
  240.     /usr/X11R6/lib/X11/twm) echo /etc/X11/twm ;;
  241.     /usr/X11R6/lib/X11/xdm) echo /etc/X11/xdm ;;
  242.     /usr/X11R6/lib/X11/xinit) echo /etc/X11/xinit ;;
  243.     /usr/X11R6/lib/X11/xkb) echo /etc/X11/xkb ;;
  244.     /usr/X11R6/lib/X11/xserver) echo /etc/X11/xserver ;;
  245.     /usr/X11R6/lib/X11/xsm) echo /etc/X11/xsm ;;
  246.     /usr/bin/X11) echo ../X11R6/bin ;;
  247.     /usr/bin/rstartd) echo ../X11R6/bin/rstartd ;;
  248.     /usr/include/X11) echo ../X11R6/include/X11 ;;
  249.     /usr/lib/X11) echo ../X11R6/lib/X11 ;;
  250.     *) internal_error "maplink() called with unknown path \"$1\"" ;;
  251.   esac
  252. }
  253.  
  254. analyze_path () {
  255.   # given a supplied set of pathnames, break each one up by directory and do an
  256.   # ls -dl on each component, cumulatively; i.e.
  257.   # analyze_path /usr/X11R6/bin -> ls -dl /usr /usr/X11R6 /usr/X11R6/bin
  258.   # Thanks to Randolph Chung for this clever hack.
  259.  
  260.   #local f g
  261.  
  262.   while [ -n "$1" ]; do
  263.     reject_whitespace "$1"
  264.     _g=
  265.     message "Analyzing $1:"
  266.     for _f in $(echo "$1" | tr / \  ); do
  267.       if [ -e /$_g$_f ]; then
  268.         ls -dl /$_g$_f /$_g$_f.dpkg-* 2> /dev/null || true
  269.         _g=$_g$_f/
  270.       else
  271.         message "/$_g$_f: nonexistent; directory contents of /$_g:"
  272.         ls -l /$_g
  273.         break
  274.       fi
  275.     done
  276.     shift
  277.   done
  278. }
  279.  
  280. find_culprits () {
  281.   #local f p dpkg_info_dir possible_culprits smoking_guns bad_packages package \
  282.   #  msg
  283.  
  284.   reject_whitespace "$1"
  285.   message "Searching for overlapping packages..."
  286.   _dpkg_info_dir=/var/lib/dpkg/info
  287.   if [ -d $_dpkg_info_dir ]; then
  288.     if [ "$(echo $_dpkg_info_dir/*.list)" != "$_dpkg_info_dir/*.list" ]; then
  289.       _possible_culprits=$(ls -1 $_dpkg_info_dir/*.list | egrep -v \
  290.         "(xbase-clients|x11-common|xfs|xlibs)")
  291.       if [ -n "$_possible_culprits" ]; then
  292.         _smoking_guns=$(grep -l "$1" $_possible_culprits || true)
  293.         if [ -n "$_smoking_guns" ]; then
  294.           _bad_packages=$(printf "\\n")
  295.           for f in $_smoking_guns; do
  296.             # too bad you can't nest parameter expansion voodoo
  297.             p=${f%*.list}      # strip off the trailing ".list"
  298.             _package=${p##*/}   # strip off the directories
  299.             _bad_packages=$(printf "%s\n%s" "$_bad_packages" "$_package")
  300.           done
  301.           _msg=$(cat <<EOF
  302. The following packages appear to have file overlaps with the X.Org packages;
  303. these packages are either very old, or in violation of Debian Policy.  Try
  304. upgrading each of these packages to the latest available version if possible:
  305. for example, with the command "apt-get install".  If no newer version of a
  306. package is available, you will have to remove it; for example, with the command
  307. "apt-get remove".  If even the latest available version of the package has
  308. this file overlap, please file a bug against that package with the Debian Bug
  309. Tracking System.  You may want to refer the package maintainer to section 12.8
  310. of the Debian Policy manual.
  311. EOF
  312. )
  313.           message "$_msg"
  314.           message "The overlapping packages are: $_bad_packages"
  315.         else
  316.           message "no overlaps found."
  317.         fi
  318.       fi
  319.     else
  320.       message "cannot search; no matches for $_dpkg_info_dir/*.list."
  321.     fi
  322.   else
  323.     message "cannot search; $_dpkg_info_dir does not exist."
  324.   fi
  325. }
  326.  
  327. # we require a readlink command or shell function
  328. if ! which readlink > /dev/null 2>&1; then
  329.   message "The readlink command was not found.  Please install version" \
  330.           "1.13.1 or later of the debianutils package."
  331.   readlink () {
  332.     # returns what symlink in $1 actually points to
  333.     perl -e '$l = shift; exit 1 unless -l $l; $r = readlink $l; exit 1 unless $r; print "$r\n"' "$1"
  334.   }
  335. fi
  336.  
  337. check_symlink () {
  338.   # syntax: check_symlink symlink
  339.   #
  340.   # See if specified symlink points where it is supposed to.  Return 0 if it
  341.   # does, and 1 if it does not.
  342.   #
  343.   # Primarily used by check_symlinks_and_warn() and check_symlinks_and_bomb().
  344.  
  345.   #local symlink
  346.  
  347.   # validate arguments
  348.   if [ $# -ne 1 ]; then
  349.     usage_error "check_symlink() called with wrong number of arguments;" \
  350.                 "expected 1, got $#"
  351.     exit $SHELL_LIB_USAGE_ERROR
  352.   fi
  353.  
  354.   _symlink="$1"
  355.  
  356.   if [ "$(maplink "$_symlink")" = "$(readlink "$_symlink")" ]; then
  357.     return 0
  358.   else
  359.     return 1
  360.   fi
  361. }
  362.  
  363. check_symlinks_and_warn () {
  364.   # syntax: check_symlinks_and_warn symlink ...
  365.   #
  366.   # For each argument, check for symlink sanity, and warn if it isn't sane.
  367.   #
  368.   # Call this function from a preinst script in the event $1 is "upgrade" or
  369.   # "install".
  370.  
  371.   #local errmsg symlink
  372.  
  373.   # validate arguments
  374.   if [ $# -lt 1 ]; then
  375.     usage_error "check_symlinks_and_warn() called with wrong number of" \
  376.                 "arguments; expected at least 1, got $#"
  377.     exit $SHELL_LIB_USAGE_ERROR
  378.   fi
  379.  
  380.   while [ -n "$1" ]; do
  381.     _symlink="$1"
  382.     if [ -L "$_symlink" ]; then
  383.       if ! check_symlink "$_symlink"; then
  384.         observe "$_symlink symbolic link points to wrong location" \
  385.                 "$(readlink "$_symlink"); removing"
  386.         rm "$_symlink"
  387.       fi
  388.     elif [ -e "$_symlink" ]; then
  389.       _errmsg="$_symlink exists and is not a symbolic link; this package cannot"
  390.       _errmsg="$_errmsg be installed until this"
  391.       if [ -f "$_symlink" ]; then
  392.         _errmsg="$_errmsg file"
  393.       elif [ -d "$_symlink" ]; then
  394.         _errmsg="$_errmsg directory"
  395.       else
  396.         _errmsg="$_errmsg thing"
  397.       fi
  398.       _errmsg="$_errmsg is removed"
  399.       die "$_errmsg"
  400.     fi
  401.     shift
  402.   done
  403. }
  404.  
  405. check_symlinks_and_bomb () {
  406.   # syntax: check_symlinks_and_bomb symlink ...
  407.   #
  408.   # For each argument, check for symlink sanity, and bomb if it isn't sane.
  409.   #
  410.   # Call this function from a postinst script.
  411.  
  412.   #local problem symlink
  413.  
  414.   # validate arguments
  415.   if [ $# -lt 1 ]; then
  416.     usage_error "check_symlinks_and_bomb() called with wrong number of"
  417.                 "arguments; expected at least 1, got $#"
  418.     exit $SHELL_LIB_USAGE_ERROR
  419.   fi
  420.  
  421.   while [ -n "$1" ]; do
  422.     _problem=
  423.     _symlink="$1"
  424.     if [ -L "$_symlink" ]; then
  425.       if ! check_symlink "$_symlink"; then
  426.         _problem=yes
  427.         warn "$_symlink symbolic link points to wrong location" \
  428.              "$(readlink "$_symlink")"
  429.       fi
  430.     elif [ -e "$_symlink" ]; then
  431.       _problem=yes
  432.       warn "$_symlink is not a symbolic link"
  433.     else
  434.       _problem=yes
  435.       warn "$_symlink symbolic link does not exist"
  436.     fi
  437.     if [ -n "$_problem" ]; then
  438.       analyze_path "$_symlink" "$(readlink "$_symlink")"
  439.       find_culprits "$_symlink"
  440.       die "bad symbolic links on system"
  441.     fi
  442.     shift
  443.   done
  444. }
  445.  
  446. font_update () {
  447.   # run $UPDATECMDS in $FONTDIRS
  448.  
  449.   #local dir cmd shortcmd x_font_dir_prefix
  450.  
  451.   _x_font_dir_prefix="/usr/share/fonts/X11"
  452.  
  453.   if [ -z "$UPDATECMDS" ]; then
  454.     usage_error "font_update() called but \$UPDATECMDS not set"
  455.   fi
  456.   if [ -z "$FONTDIRS" ]; then
  457.     usage_error "font_update() called but \$FONTDIRS not set"
  458.   fi
  459.  
  460.   reject_unlikely_path_chars "$UPDATECMDS"
  461.   reject_unlikely_path_chars "$FONTDIRS"
  462.  
  463.   for _dir in $FONTDIRS; do
  464.     if [ -d "$_x_font_dir_prefix/$_dir" ]; then
  465.       for _cmd in $UPDATECMDS; do
  466.         if which "$_cmd" > /dev/null 2>&1; then
  467.           _shortcmd=${_cmd##*/}
  468.           observe "running $_shortcmd in $_dir font directory"
  469.       _cmd_opts=
  470.           if [ "$_shortcmd" = "update-fonts-alias" ]; then
  471.             _cmd_opts=--x11r7-layout
  472.           fi
  473.           if [ "$_shortcmd" = "update-fonts-dir" ]; then
  474.             _cmd_opts=--x11r7-layout
  475.           fi
  476.           if [ "$_shortcmd" = "update-fonts-scale" ]; then
  477.             _cmd_opts=--x11r7-layout
  478.           fi
  479.           $_cmd $_cmd_opts $_dir || warn "$_cmd $_cmd_opts $_dir" \
  480.                               "failed; font directory data may not" \
  481.                               "be up to date"
  482.         else
  483.           warn "$_cmd not found; not updating corresponding $_dir font" \
  484.                "directory data"
  485.         fi
  486.       done
  487.     else
  488.       warn "$_dir is not a directory; not updating font directory data"
  489.     fi
  490.   done
  491. }
  492.  
  493. remove_conffile_prepare () {
  494.   # syntax: remove_conffile_prepare filename official_md5sum ...
  495.   #
  496.   # Check a conffile "filename" against a list of canonical MD5 checksums.
  497.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  498.   # operands provided, then prepare the conffile for removal from the system.
  499.   # We defer actual deletion until the package is configured so that we can
  500.   # roll this operation back if package installation fails.
  501.   #
  502.   # Call this function from a preinst script in the event $1 is "upgrade" or
  503.   # "install" and verify $2 to ensure the package is being upgraded from a
  504.   # version (or installed over a version removed-but-not-purged) prior to the
  505.   # one in which the conffile was obsoleted.
  506.  
  507.   #local conffile current_checksum
  508.  
  509.   # validate arguments
  510.   if [ $# -lt 2 ]; then
  511.     usage_error "remove_conffile_prepare() called with wrong number of" \
  512.                 "arguments; expected at least 2, got $#"
  513.     exit $SHELL_LIB_USAGE_ERROR
  514.   fi
  515.  
  516.   _conffile="$1"
  517.   shift
  518.  
  519.   # does the _conffile even exist?
  520.   if [ -e "$_conffile" ]; then
  521.     # calculate its checksum
  522.     _current_checksum=$(md5sum < "$_conffile" | sed 's/[[:space:]].*//')
  523.     # compare it to each supplied checksum
  524.     while [ -n "$1" ]; do
  525.       if [ "$_current_checksum" = "$1" ]; then
  526.         # we found a match; move the confffile and stop looking
  527.         observe "preparing obsolete conffile $_conffile for removal"
  528.         mv "$_conffile" "$_conffile.$THIS_PACKAGE-tmp"
  529.         break
  530.       fi
  531.       shift
  532.     done
  533.   fi
  534. }
  535.  
  536. remove_conffile_commit () {
  537.   # syntax: remove_conffile_commit filename
  538.   #
  539.   # Complete the removal of a conffile "filename" that has become obsolete.
  540.   #
  541.   # Call this function from a postinst script after having used
  542.   # remove_conffile_prepare() in the preinst.
  543.  
  544.   #local conffile
  545.  
  546.   # validate arguments
  547.   if [ $# -ne 1 ]; then
  548.     usage_error "remove_conffile_commit() called with wrong number of" \
  549.                 "arguments; expected 1, got $#"
  550.     exit $SHELL_LIB_USAGE_ERROR
  551.   fi
  552.  
  553.   _conffile="$1"
  554.  
  555.   # if the temporary file created by remove_conffile_prepare() exists, remove it
  556.   if [ -e "$_conffile.$THIS_PACKAGE-tmp" ]; then
  557.     observe "committing removal of obsolete conffile $_conffile"
  558.     rm "$_conffile.$THIS_PACKAGE-tmp"
  559.   fi
  560. }
  561.  
  562. remove_conffile_rollback () {
  563.   # syntax: remove_conffile_rollback filename
  564.   #
  565.   # Roll back the removal of a conffile "filename".
  566.   #
  567.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  568.   # or "abort-install" is  after having used remove_conffile_prepare() in the
  569.   # preinst.
  570.  
  571.   #local conffile
  572.  
  573.   # validate arguments
  574.   if [ $# -ne 1 ]; then
  575.     usage_error "remove_conffile_rollback() called with wrong number of" \
  576.                 "arguments; expected 1, got $#"
  577.     exit $SHELL_LIB_USAGE_ERROR
  578.   fi
  579.  
  580.   _conffile="$1"
  581.  
  582.   # if the temporary file created by remove_conffile_prepare() exists, move it
  583.   # back
  584.   if [ -e "$_conffile.$THIS_PACKAGE-tmp" ]; then
  585.     observe "rolling back removal of obsolete conffile $_conffile"
  586.     mv "$_conffile.$THIS_PACKAGE-tmp" "$_conffile"
  587.   fi
  588. }
  589.  
  590. replace_conffile_with_symlink_prepare () {
  591.   # syntax: replace_conffile_with_symlink_prepare oldfilename newfilename \
  592.   # official_md5sum ...
  593.   #
  594.   # Check a conffile "oldfilename" against a list of canonical MD5 checksums.
  595.   # If the file's current MD5 checksum matches one of the "official_md5sum"
  596.   # operands provided, then prepare the conffile for removal from the system.
  597.   # We defer actual deletion until the package is configured so that we can
  598.   # roll this operation back if package installation fails. Otherwise copy it
  599.   # to newfilename and let dpkg handle it through conffiles mechanism.
  600.   #
  601.   # Call this function from a preinst script in the event $1 is "upgrade" or
  602.   # "install" and verify $2 to ensure the package is being upgraded from a
  603.   # version (or installed over a version removed-but-not-purged) prior to the
  604.   # one in which the conffile was obsoleted.
  605.  
  606.   #local conffile current_checksum
  607.  
  608.   # validate arguments
  609.   if [ $# -lt 3 ]; then
  610.     usage_error "replace_conffile_with_symlink_prepare() called with wrong" \
  611.                 " number of arguments; expected at least 3, got $#"
  612.     exit $SHELL_LIB_USAGE_ERROR
  613.   fi
  614.  
  615.   _oldconffile="$1"
  616.   shift
  617.   _newconffile="$1"
  618.   shift
  619.  
  620.   remove_conffile_prepare "$_oldconffile" "$@"
  621.   # If $_oldconffile still exists, then md5sums didn't match.
  622.   # Copy it to new one.
  623.   if [ -f "$_oldconffile" ]; then
  624.     cp "$_oldconffile" "$_newconffile"
  625.   fi
  626.  
  627. }
  628.  
  629. replace_conffile_with_symlink_commit () {
  630.   # syntax: replace_conffile_with_symlink_commit oldfilename
  631.   #
  632.   # Complete the removal of a conffile "oldfilename" that has been
  633.   # replaced by a symlink.
  634.   #
  635.   # Call this function from a postinst script after having used
  636.   # replace_conffile_with_symlink_prepare() in the preinst.
  637.  
  638.   #local conffile
  639.  
  640.   # validate arguments
  641.   if [ $# -ne 1 ]; then
  642.     usage_error "replace_conffile_with_symlink_commit() called with wrong" \
  643.                 "number of arguments; expected 1, got $#"
  644.     exit $SHELL_LIB_USAGE_ERROR
  645.   fi
  646.  
  647.   _conffile="$1"
  648.  
  649.   remove_conffile_commit "$_conffile"
  650. }
  651.  
  652. replace_conffile_with_symlink_rollback () {
  653.   # syntax: replace_conffile_with_symlink_rollback oldfilename newfilename
  654.   #
  655.   # Roll back the replacing of a conffile "oldfilename" with symlink to
  656.   # "newfilename".
  657.   #
  658.   # Call this function from a postrm script in the event $1 is "abort-upgrade"
  659.   # or "abort-install" and verify $2 to ensure the package failed to upgrade
  660.   # from a version (or install over a version removed-but-not-purged) prior
  661.   # to the one in which the conffile was obsoleted.
  662.   # You should have  used replace_conffile_with_symlink_prepare() in the
  663.   # preinst.
  664.  
  665.   #local conffile
  666.  
  667.   # validate arguments
  668.   if [ $# -ne 2 ]; then
  669.     usage_error "replace_conffile_with_symlink_rollback() called with wrong" \
  670.                 "number of arguments; expected 2, got $#"
  671.     exit $SHELL_LIB_USAGE_ERROR
  672.   fi
  673.  
  674.   _oldconffile="$1"
  675.   _newconffile="$2"
  676.  
  677.   remove_conffile_rollback "$_oldconffile"
  678.   if [ -f "$_newconffile" ]; then
  679.     rm "$_newconffile"
  680.   fi
  681. }
  682.  
  683. run () {
  684.   # syntax: run command [ argument ... ]
  685.   #
  686.   # Run specified command with optional arguments and report its exit status.
  687.   # Useful for commands whose exit status may be nonzero, but still acceptable,
  688.   # or commands whose failure is not fatal to us.
  689.   #
  690.   # NOTE: Do *not* use this function with db_get or db_metaget commands; in
  691.   # those cases the return value of the debconf command *must* be checked
  692.   # before the string returned by debconf is used for anything.
  693.  
  694.   #local retval
  695.  
  696.   # validate arguments
  697.   if [ $# -lt 1 ]; then
  698.     usage_error "run() called with wrong number of arguments; expected at" \
  699.                 "least 1, got $#"
  700.     exit $SHELL_LIB_USAGE_ERROR
  701.   fi
  702.  
  703.   "$@" || _retval=$?
  704.  
  705.   if [ ${_retval:-0} -ne 0 ]; then
  706.     observe "command \"$*\" exited with status $_retval"
  707.   fi
  708. }
  709.  
  710. register_x_lib_dir_with_ld_so () {
  711.   # syntax: register_x_lib_dir_with_ld_so
  712.   #
  713.   # Configure the dynamic loader ld.so to search /usr/X11R6/lib for shared
  714.   # libraries.
  715.   #
  716.   # Call this function from the postinst script of a package that places a
  717.   # shared library in /usr/X11R6/lib, before invoking ldconfig.
  718.  
  719.   #local dir ldsoconf
  720.  
  721.   _dir="/usr/X11R6/lib"
  722.   _ldsoconf="/etc/ld.so.conf"
  723.  
  724.   # is the line not already present?
  725.   if ! fgrep -qsx "$_dir" "$_ldsoconf"; then
  726.     observe "adding $_dir directory to $_ldsoconf"
  727.     echo "$_dir" >> "$_ldsoconf"
  728.   fi
  729. }
  730.  
  731. deregister_x_lib_dir_with_ld_so () {
  732.   # syntax: deregister_x_lib_dir_with_ld_so
  733.   #
  734.   # Configure dynamic loader ld.so to not search /usr/X11R6/lib for shared
  735.   # libraries, if and only if no shared libaries remain there.
  736.   #
  737.   # Call this function from the postrm script of a package that places a shared
  738.   # library in /usr/X11R6/lib, in the event "$1" is "remove", and before
  739.   # invoking ldconfig.
  740.  
  741.   #local dir ldsoconf fgrep_status cmp_status
  742.  
  743.   _dir="/usr/X11R6/lib"
  744.   _ldsoconf="/etc/ld.so.conf"
  745.  
  746.   # is the line present?
  747.   if fgrep -qsx "$_dir" "$_ldsoconf"; then
  748.     # are there any shared objects in the directory?
  749.     if [ "$(echo "$_dir"/lib*.so.*.*)" = "$_dir/lib*.so.*.*" ]; then
  750.       # glob expansion produced nothing, so no shared libraries are present
  751.       observe "removing $_dir directory from $_ldsoconf"
  752.       # rewrite the file (very carefully)
  753.       set +e
  754.       fgrep -svx "$_dir" "$_ldsoconf" > "$_ldsoconf.dpkg-tmp"
  755.       _fgrep_status=$?
  756.       set -e
  757.       case $_fgrep_status in
  758.         0|1) ;; # we don't actually care if any lines matched or not
  759.         *) die "error reading \"$_ldsoconf\"; fgrep exited with status" \
  760.           "$_fgrep_status" ;;
  761.       esac
  762.       set +e
  763.       cmp -s "$_ldsoconf.dpkg-tmp" "$_ldsoconf"
  764.       _cmp_status=$?
  765.       set -e
  766.       case $_cmp_status in
  767.         0) rm "$_ldsoconf.dpkg-tmp" ;; # files are identical
  768.         1) mv "$_ldsoconf.dpkg-tmp" "$_ldsoconf" ;; # files differ
  769.         *) die "error comparing \"$_ldsoconf.dpkg-tmp\" to \"$_ldsoconf\";" \
  770.           "cmp exited with status $_cmp_status" ;;
  771.       esac
  772.     fi
  773.   fi
  774. }
  775.  
  776. make_symlink_sane () {
  777.   # syntax: make_symlink_sane symlink target
  778.   #
  779.   # Ensure that the symbolic link symlink exists, and points to target.
  780.   #
  781.   # If symlink does not exist, create it and point it at target.
  782.   #
  783.   # If symlink exists but is not a symbolic link, back it up.
  784.   #
  785.   # If symlink exists, is a symbolic link, but points to the wrong location, fix
  786.   # it.
  787.   #
  788.   # If symlink exists, is a symbolic link, and already points to target, do
  789.   # nothing.
  790.   #
  791.   # This function wouldn't be needed if ln had an -I, --idempotent option.
  792.  
  793.   # Validate arguments.
  794.   if [ $# -ne 2 ]; then
  795.     usage_error "make_symlink_sane() called with wrong number of arguments;" \
  796.       "expected 2, got $#"
  797.     exit $SHELL_LIB_USAGE_ERROR
  798.   fi
  799.  
  800.   # We could just use the positional parameters as-is, but that makes things
  801.   # harder to follow.
  802.   #local symlink target
  803.  
  804.   _symlink="$1"
  805.   _target="$2"
  806.  
  807.   if [ -L "$_symlink" ] && [ "$(readlink "$_symlink")" = "$_target" ]; then
  808.       observe "link from $_symlink to $_target already exists"
  809.   else
  810.     observe "creating symbolic link from $_symlink to $_target"
  811.     mkdir -p "${_target%/*}" "${_symlink%/*}"
  812.     ln -s -b -S ".dpkg-old" "$_target" "$_symlink"
  813.   fi
  814. }
  815.  
  816. migrate_dir_to_symlink () {
  817.   # syntax: migrate_dir_to_symlink old_location new_location
  818.   #
  819.   # Per Debian Policy section 6.5.4, "A directory will never be replaced by a
  820.   # symbolic link to a directory or vice versa; instead, the existing state
  821.   # (symlink or not) will be left alone and dpkg will follow the symlink if
  822.   # there is one."
  823.   #
  824.   # We have to do it ourselves.
  825.   #
  826.   # This function moves the contents of old_location, a directory, into
  827.   # new_location, a directory, then makes old_location a symbolic link to
  828.   # new_location.
  829.   #
  830.   # old_location need not exist, but if it does, it must be a directory (or a
  831.   # symlink to a directory).  If it is not, it is backed up.  If new_location
  832.   # exists already and is not a directory, it is backed up.
  833.   #
  834.   # This function should be called from a package's preinst so that other
  835.   # packages unpacked after this one --- but before this package's postinst runs
  836.   # --- are unpacked into new_location even if their payloads contain
  837.   # old_location filespecs.
  838.  
  839.   # Validate arguments.
  840.   if [ $# -ne 2 ]; then
  841.     usage_error "migrate_dir_to_symlink() called with wrong number of"
  842.                 "arguments; expected 2, got $#"
  843.     exit $SHELL_LIB_USAGE_ERROR
  844.   fi
  845.  
  846.   # We could just use the positional parameters as-is, but that makes things
  847.   # harder to follow.
  848.   local _new _old
  849.  
  850.   _old="$1"
  851.   _new="$2"
  852.  
  853.   # Is old location a symlink?
  854.   if [ -L "$_old" ]; then
  855.     # Does it already point to new location?
  856.     if [ "$(readlink "$_old")" = "$_new" ]; then
  857.       # Nothing to do; migration has already been done.
  858.       observe "migration of $_old to $_new already done"
  859.       return 0
  860.     else
  861.       # Back it up.
  862.       warn "backing up symbolic link $_old as $_old.dpkg-old"
  863.       mv -b "$_old" "$_old.dpkg-old"
  864.     fi
  865.   fi
  866.  
  867.   # Does old location exist, but is not a directory?
  868.   if [ -e "$_old" ] && ! [ -d "$_old" ]; then
  869.       # Back it up.
  870.       warn "backing up non-directory $_old as $_old.dpkg-old"
  871.       mv -b "$_old" "$_old.dpkg-old"
  872.   fi
  873.  
  874.   observe "migrating $_old to $_new"
  875.  
  876.   # Is new location a symlink?
  877.   if [ -L "$_new" ]; then
  878.     # Does it point the wrong way, i.e., back to where we're migrating from?
  879.     if [ "$(readlink "$_new")" = "$_old" ]; then
  880.       # Get rid of it.
  881.       observe "removing symbolic link $_new which points to $_old"
  882.       rm "$_new"
  883.     else
  884.       # Back it up.
  885.       warn "backing up symbolic link $_new as $_new.dpkg-old"
  886.       mv -b "$_new" "$_new.dpkg-old"
  887.     fi
  888.   fi
  889.  
  890.   # Does new location exist, but is not a directory?
  891.   if [ -e "$_new" ] && ! [ -d "$_new" ]; then
  892.     warn "backing up non-directory $_new as $_new.dpkg-old"
  893.     mv -b "$_new" "$_new.dpkg-old"
  894.   fi
  895.  
  896.   # Create new directory if it does not yet exist.
  897.   if ! [ -e "$_new" ]; then
  898.     observe "creating $_new"
  899.     mkdir -p "$_new"
  900.   fi
  901.  
  902.   # Copy files in old location to new location.  Back up any filenames that
  903.   # already exist in the new location with the extension ".dpkg-old".
  904.   observe "copying files from $_old to $_new"
  905.   if ! (cd "$_old" && cp -a -b -S ".dpkg-old" . "$_new"); then
  906.     die "error(s) encountered while copying files from $_old to $_new"
  907.   fi
  908.  
  909.   # Remove files at old location.
  910.   observe "removing $_old"
  911.   rm -r "$_old"
  912.  
  913.   # Create symlink from old location to new location.
  914.   make_symlink_sane "$_old" "$_new"
  915. }
  916.  
  917. # vim:set ai et sw=2 ts=2 tw=80:
  918.  
  919. # GOBSTOPPER: The X Strike Force shell library ends here.
  920.  
  921. # Automatically added by dh_installxfonts
  922. if [ -x "`which update-fonts-dir 2>/dev/null`" ]; then
  923. update-fonts-dir --x11r7-layout misc;update-fonts-alias misc
  924. fi
  925. # End automatically added section
  926.  
  927.  
  928. if [ "$1" = "abort-install" ] || [ "$1" = "abort-upgrade" ]; then
  929.     remove_conffile_rollback /etc/X11/fonts/X11R7/misc/xfonts-base.alias
  930. fi
  931.  
  932. if [ "$1" = "purge" ]; then
  933.     for DIR in /etc/X11/fonts/X11R7/misc /etc/X11/fonts/X11R7 \
  934.         /etc/X11/fonts/misc /etc/X11/fonts /etc/X11; do
  935.         rmdir $DIR 2>/dev/null || true
  936.     done
  937. fi
  938.  
  939. exit 0
  940.  
  941. # vim:set ai et sw=4 ts=4 tw=80:
  942.